package com.codemeta.bokit.comm.kit;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.ContentType;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.function.Function;

/**
 * 字符串工具类
 *
 * @author 美萌:hechen
 * @date 2020/6/23
 */
public class StrKit extends StrUtil {

    /**
     * 字符串分割转列表int版
     *
     * @param strings 待分割字符串
     * @return .
     * @apiNote 默认分割符号为“,”、函数为str->int
     */
    public static List<Integer> splitInt(String strings) {
        return split(strings, COMMA, Integer::valueOf);
    }

    /**
     * 字符串分割转列表
     *
     * @param strings   .
     * @param separator 分割符号
     * @param fun       返回数据类型转换函数
     * @param <R>       .
     * @return .
     */
    public static <R> List<R> split(String strings, String separator, Function<String, R> fun) {
        if (isBlankOrUndefined(strings)) {
            return new ArrayList<>();
        }
        List<String> strList = splitTrim(strings, separator);
        return StreamKit.mapDistinct(strList, fun);
    }

    /**
     * 忽略特殊符号
     *
     * @param str .
     * @return .
     */
    public static String ignoreSymbol(String str) {
        if (isBlankOrUndefined(str)) {
            return str;
        } else {
            return str.replace("%", "").replace(COMMA, "");
        }
    }

    /**
     * 给字符串添加like查询
     *
     * @param name 字符串
     * @return %字符串%
     */
    public static String joinLike(String name) {
        name = addPrefixIfNot(name, "%");
        name = addSuffixIfNot(name, "%");
        return name;
    }

    /**
     * 根据日期随机字符串
     *
     * @param sumDate 指定日期
     * @return .
     */
    public static String randomDateStr(Date sumDate) {
        return DateUtil.formatDate(sumDate) + RandomUtil.randomString(4);
    }

    /**
     * 截取含json字符串的键值
     *
     * @param jsonStr .
     * @param jsonKey .
     * @return .
     */
    public static String splitJson(String jsonStr, String jsonKey) {
        String regex = "\"" + jsonKey + "\":\"(.*?)\\\"";
        return ReUtil.getGroup1(regex, jsonStr);
    }

    /**
     * 判定是否为JSON格式数据
     *
     * @param s .
     * @return .
     */
    public static boolean isJson(String s) {
        final ContentType contentType = ContentType.get(s);
        return ContentType.JSON.equals(contentType);
    }

    /**
     * 日期文件路径
     *
     * @param path .
     * @return 返回格式：{path}/yyyy-MM-dd/
     */
    public static String dateFilePath(String path) {
        String sss = StrUtil.join(StrUtil.SLASH, path, DateUtil.today()) + StrUtil.SLASH;
        return sss.replaceAll("//", "/");
    }

    /**
     * 随机日期文件路径及uuid文件名
     *
     * @param path /opt/files/
     * @param type .xls|.jpg
     * @return 返回格式：{path}/yyyy-MM-dd/uuid.xls
     */
    public static String uuidDateFilePath(String path, String type) {
        return dateFilePath(path) + IdUtil.fastUUID() + type;
    }

    /**
     * 是否存在不为空的字符串
     *
     * @param args .
     * @return .
     */
    public static boolean isAnyNotBlank(CharSequence... args) {
        if (ArrayUtil.isEmpty(args)) {
            return false;
        }
        for (CharSequence str : args) {
            if (isNotBlank(str)) {
                return true;
            }
        }
        return false;
    }
}